class Observer{
    constructor (data) {
        this.observe(data)
    }
    observe (data) {
        // 不考虑数组 存在data 并且data为一个对象
        if (data && typeof data === 'object'){
            // 遍历对象的key
            Object.keys(data).forEach(key => {
                // 将对象 键传进入 值传进去
                this.defineReactive(data, key, data[key])
            })
        }
    }
    defineReactive (obj, key, value) {
        // 递归遍历
        this.observe(value)
        const dep = new Dep()
        Object.defineProperty(obj, key, {
            configurable: true,
            enumerable: true,
            get () {
                // 如果存在订阅者 往收集依赖对象数组中添加订阅者
                Dep.target && dep.addSub(Dep.target)
                return value
            },
            set: (newValue) => {
                if ( newValue != value) {
                    // 如果直接赋值对象 也需要对这个对象进行数据监听
                    this.observe(newValue)
                    value = newValue
                    // dep.notify 通知watcher变化 更新视图
                    dep.notify()
                }
            }
        })
    }
}
